package com.example.myandroidapp.kotlin

/*
* 空安全语法: 注意：非空安全，Kotlin 中的变量不能为 null
* 1:可空类型 : ?
* 2：安全调用操作符 ：?.
* 3:Elvis 操作符(备选操作符) : ?:
*
* 4：lateinit 延迟初始化：延迟初始化，在变量声明时加上 lateinit 关键字，然后就可以在变量被使用时赋值。
*/

fun main() {
    // 非空类型
    var name: String = "张三"
    //name = null // 报错

    //可空类型
    var name2: String? = null // 可空类型

    // 安全调用操作符
    val length = name2?.length  // 如果 name2 为 null，length 也会返回 null
    println(length)

    // Elvis 操作符(备选操作符)
    val length2 = name2?.length ?: 0  // 如果 name2 为 null，length 将为 0
    println(length2)


    // 延迟初始化
    val app = FoodDeliveryApp()

    // 错误尝试：在初始化前使用
    try {
        println("尝试在初始化前显示菜单:")
        app.showMenu()
    } catch (e: UninitializedPropertyAccessException) {
        println("错误: ${e.message}\n")
    }

    // 正确流程：先初始化再使用
    app.initializeApp()

    // 再次尝试使用菜单
    println("\n用户浏览菜单:")
    app.showMenu()

}


//延迟初始化相关测试类
class FoodDeliveryApp {
    // 餐厅菜单 - 需要从网络加载后才能使用
    // 使用 lateinit 表示"稍后一定会初始化"
    lateinit var restaurantMenu: List<String>

    // 用户地址 - 需要用户选择后才能确定
    lateinit var deliveryAddress: String

    // 初始化函数 - 相当于用户打开APP
    fun initializeApp() {
        println("=== 外卖APP启动 ===")

        // 模拟网络请求加载菜单
        loadMenuFromServer()

        // 模拟用户选择地址
        selectAddress()

        // 使用菜单
        showMenu()

        // 使用地址
        startDelivery()
    }

    private fun loadMenuFromServer() {
        println("从服务器加载菜单...")
        restaurantMenu = listOf("汉堡", "薯条", "可乐", "鸡块")
        println("菜单加载完成!")
    }

    private fun selectAddress() {
        println("用户选择送货地址...")
        deliveryAddress = "北京市海淀区中关村大街123号"
        println("地址已设置!")
    }

    fun showMenu() {
        // 使用前检查是否已初始化
        if (::restaurantMenu.isInitialized) {
            println("\n今日菜单:")
            restaurantMenu.forEachIndexed { i, item ->
                println("${i + 1}. $item")
            }
        } else {
            println("菜单未加载，请稍后再试")
        }
    }

    fun startDelivery() {
        if (::deliveryAddress.isInitialized) {
            println("\n正在送货到: $deliveryAddress")
            println("预计30分钟送达!")
        } else {
            println("请先设置送货地址")
        }
    }
}